【万泉河】没有定时器的延时控制
关于static静态变量的用法和意义, 已经写过了2篇文章,以及通过投票讨论过了。
因为发表平台容量限制的问题,分别发在了不同的平台上, 读者需要跳转到响应的地址去看原文。
【万泉河】FB内的static静态变量是全局变量吗? http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1513112&b_id=50&b_sid=0&s_id=0&num=46#anch
【万泉河】PLC系统变量的作用域和生存期 (这里被阉割比较多, 全文的内容在西门子网站的附件里,点本文的原文链接, 也可以跳转到)
我自己的公众号平台,等以后有位置了, 会再搬回来。
在FB块内尽量使用static静态变量, 而不使用全局的M变量,已经被广泛接受了。 然而PLC标准化编程社区内仍然有学员问我怎么能不用定时器,让我意识到了,看来这堂基本功的课, 很多人还是需要补一下的。
所以这一篇是补基本功的。
说是基本功,但在普通的编程教程里,可能是属于高端应用,基础培训课里,培训老师们恐怕也不会特别去讲解,讲解也不一定给讲透。
这里的核心知识点是:多重背景。
先在STEP7 V5.X的FB实现:
(有人问如果我做的是FC,而不是FB怎么办?答案是如果需要延时控制的逻辑,那就不适合在FC里面做,复制粘贴,生成新的FB吧!)
因为道理比较基础,所以索性设计一个复杂点的接近实用性的任务:
任务为:模块一个in,一个out,要求当in为1时,out输出为闪烁, 具体闪烁为亮1S灭4S,然后循环。 即以5S的周期循环亮, 每次亮1S。
首先,除了建立in和out接口外,在静态变量中,分别建立一个TON1和TOF1变量,数据类型直接输入SFB4和SFB5。可以看到,一旦输入完成后, 提示的类型就已经自动变为了TON和TOF。如图:
其实也完全可以直接从系统函数库中选择需要的SFB,还可以顺便了解下这些SFB的功能。 这里直接输入只是为了演示快捷。
然后开始编程。
下面是重点:
刚才建立的2个变量实例, 在左边的多重背景实例中存在了。 选中, 拖动到梯形图中。
这一点在STEP7中很不方便, 只有这么一个使用方法。所以很多新手找不到。 好不容易找人帮忙用过一次以后却很快就忘了,下次还是找不到。
而到PORTAL以后,就方便多了。
然后是具体的程序逻辑,个人习惯做法, 分享给大家参考。
其中NW2的IN前面, TON1.Q并联了两次。 逻辑上效果和用1次是一样的。 原因是如果用1个, 梯形图报错。 这应该是BUG。
然后这个FB1完成了, 可以被多次调用, 每次按照常规给建立一个背景数据块即可。 从此以后不必在意这里用过定时器, 也不必担心如果FB1被调用200次, 会导致timer用光或者冲突的问题了。
在PORTAL/S7-1200中的实现:
就比较简单了, 梯形图中选择TON后, 跳出来选择多重背景。 为了整齐起见可以给定义名称。
其实如果这个定时器的使用范围仅仅在一个NW内,反而使用缺省的名称更随意些。 表达的局部使用的含义更强烈。
然后几乎同样的代码:
同样实现了任务需要的功能。
等等, 好像有点问题,在PORTAL里面, 绝对地址%T5可以定义, 但却不可以使用了 。
原因呢?看help:
原来T和C到S7-1200/1500就已经自动不支持了。
我因为在很早之前,就已经完全抛弃了T,最多偶尔可能用到M, 所以甚至都没注意到这一点。
所以, 我抛出 “好程序标准不使用M和T” 的观点时候,听到反对声音一片, 甚至有人跟我辩解说, 既然PLC系统内设计了这块变量区,你万泉河凭啥不许俺使用咧?
(我甚至隐隐约约听到有的人在哭诉的声音)
现在我们知道了, 其实西门子早就走在前面了。
当然啦,绝不会因为西门子的新PLC系统不提供TIMER了, 所以大家写出来的程序就自动都是好程序了。
因为, 我所提出的好程序的标准,那只是开始,起步阶段的第一条而已。
所谓这个标准, 只是一个必要条件,就是说, 使用M和T的程序一定不是好程序。
而更多的标准细节, 我就不公开得罪人了。 以后只在《PLC标准化编程社区》里面和大家共同探讨商定了。
有兴趣的同学,请关注【万泉河】一个完全不使用T和M全局变量的好标准的PLC程序分享计划
微信联系:178616417, 注明众筹报名。
人数即将达标, 预期下月即可开张了!